/*
        Class administrator
*/

#ifndef ADMINISTRATOR_H
#define ADMINISTRATOR_H

#include "graph.hpp"
#include "graphFactory.hpp"
#include "searchAlgorithm.hpp"
#include "../logger/logger.hpp"


class Administrator {
private:
        Graph   graph;
        Logger  *logger;
        string  pathFound;
        string  roadPathFound;
        int     errorCode;
		int		priority;

		int		searchingBy; //0 address , 1 objectType

		int destinyRoadHeight;
		string destinyRoadName;
		ObjectType destinyObjectType;

				/**
         * Metodo que controla la ejecucion de la busqueda del camino optimo.
         */
        float searchPath(std::string originId, std::string destinyId, int priority);
    

		/**
         * Metodo que controla la ejecucion de la busqueda del camino optimo.
         */
        float searchPath(std::string originRoadName, int originRoadHeigh, std::string destinyRoadName, int destinyRoadHeigh , int priority,bool setPath);

		/**
         * Metodo que controla la ejecucion de la busqueda del camino optimo.
         */
		int searchPath(std::string originRoadName, int originRoadHeigh, ObjectType type);

public:
        /**
         * Constructor por defecto de la clase Administrator.
         */
        Administrator();

        /**
         * Constructor parametrizado de la clase Administrator.
         */
        Administrator(std::string &fileToParseN, std::string &fileToParseE,std::string &fileToParseO, Logger *logger);

        /**
         * Generador del contenido de la clase Administrator.
         */
        void create(std::string &fileToParseN, std::string &fileToParseE,std::string &fileToParseO, Logger *logger);

		


		/**
         * Metodo para verificar la creacion del grafo.
         * @return true en caso de tener el grafo creado.
         * @return false en caso contrario.
         */
	    bool isGraphCreated();

		/**
		 * Metodo getter del camino optimo.
		 * @return Retorna el camino optimo.
		 */
        string getPath();

		/**
		 * Metodo getter del camino optimo en formato nombre de calles.
		 * @return Retorna el camino optimo.
		 */
        string getRoadPath();

        /**
         * Metodo getter del codigo de error.
         * @return Retorna un entero indicando el codigo de error.
         */
        int getErrorCode();



        /**
         * Metodo getter del grafo.
         * @return Retorna el grafo.
         */
        Graph *getGraph();

        void cleanBestPathValues();

        /**
         * Destructor de la clase Administrator.
         */
        virtual ~Administrator();

		/**
			Metodo Publico para busqueda de camino
		*/
		int search(std::string originRoadName, int originRoadHeight, std::string destinyRoadName, int destinyRoadHeight , int priority);

		/**
			Metodo Publico para busqueda de camino
		*/
		int search(std::string originRoadName, int originRoadHeigh, ObjectType type,int priority);

		/**
			Metodo Publico para busqueda de camino
		*/
		int search(std::string originId, std::string destinyId, int priority);


		int updatePosition(std::string roadName,int roadHeight);


};

#endif //ADMINISTRATOR_H